
/**枚举
使用枚举我们可以定义一些带名字的常量。 使用枚举可以清晰地表达意图或创建一组有区别的用例。 TypeScript支持数字的和基于字符串的枚举。
我们定义了一个数字枚举， Up使用初始化为 1。 其余的成员会从 1开始自动增长。 换句话说， Direction.Up的值为 1， Down为 2， Left为 3， Right为 4。
*/
enum Direction{
  UP=1,
  Down,
  Left,
  RIght
}
//还可以完全不使用初始化器：Up的值为 0， Down的值为 1等等。
enum Direction2 {
  Up,
  Down,
  Left,
  Right,
}

/*const枚举
大多数情况下，枚举是十分有效的方案。 然而在某些情况下需求很严格。 为了避免在额外生成的代码上的开销和额外的非直接的对枚举成员的访问，我们可以使用 const枚举。 常量枚举通过在枚举上使用 const修饰符来定义。
*/
const enum Enum {
    A = 1,
    B = A * 2
}

/**字符串枚举
字符串枚举的概念很简单，但是有细微的 运行时的差别。 在一个字符串枚举里，每个成员都必须用字符串字面量，或另外一个字符串枚举成员进行初始化。
typteScript的枚举似乎和java有一些区别
*/
enum Direction4 {
  Up = "UP",
  Down = "DOWN",
  Left = "LEFT",
  Right = "RIGHT",
}

/**反向映射
除了创建一个以属性名做为对象成员的对象之外，数字枚举成员还具有了 反向映射，从枚举值到枚举名字。 例如，在下面的例子中： */
class A{
  name:string;
}
enum Enum1 {
  A
}
let a1 = Enum1.A;
let nameOfA = Enum1[a1]; // "A"